package list

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/logger"
	"sg-backend/model/user"
	"sg-backend/utils"
)

// UpdateUser 修改用户
func UpdateUser(ctx *fiber.Ctx) error {
	// 权限验证
	utils.CheckPermsByTag("UserList", global.AuthUser.UserId, "update")

	// 获取数据
	var dataDto _UserListDto
	if err := ctx.BodyParser(&dataDto); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 验证数据
	var _user user.User

	// 1，邮箱不能重复
	if len(dataDto.Email) > 1 {
		noDuplicateMailCheck := global.DB.Where(
			"email = ? AND id != ?", dataDto.Email, dataDto.Id,
		).Find(&_user)
		if noDuplicateMailCheck.RowsAffected != 0 {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "此邮箱号已存在，不允许重复！",
			})
		}
	}
	// 2，手机号不能重复
	if len(dataDto.Mobile) > 1 {
		noDuplicateMobileCheck := global.DB.Where(
			"mobile = ? AND id != ?", dataDto.Mobile, dataDto.Id,
		).Find(&_user)
		if noDuplicateMobileCheck.RowsAffected != 0 {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "此手机号码已存在，不允许重复！",
			})
		}
	}

	// 保存到数据库
	updateObj := user.User{Id: dataDto.Id}
	global.DB.First(&updateObj)
	updateObj.Nickname = dataDto.Nickname
	updateObj.Gender = dataDto.Gender
	updateObj.Email = dataDto.Email
	updateObj.Mobile = dataDto.Mobile
	updateObj.IsSuperuser = dataDto.IsSuperuser
	updateObj.IsActive = dataDto.IsActive
	updateObj.Avatar = dataDto.Avatar

	// 修改密码
	if len(dataDto.Password) > 0 {
		var passwordSalt = utils.GetRandomString(16)
		var encryptPassword = utils.SHAEncrypt(dataDto.Password + passwordSalt)
		updateObj.Password = encryptPassword
		updateObj.PasswordSalt = passwordSalt
	}

	// 保存到数据库
	r := global.DB.Save(&updateObj)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("更新失败！错误：%v", r.Error),
		})
	}

	// 新增成功，写日志
	logger.DbInfo(global.AuthUser.Username, fmt.Sprintf("更新用户成功！数据：%+v", dataDto))
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "更新成功！",
	})
}
